/*
 *-----------------------------------------------------------------------------
 * The confidential and proprietary information contained in this file may
 * only be used by a person authorised under and to the extent permitted
 * by a subsisting licensing agreement from  CHIPSEA.
 *
 *            (C) COPYRIGHT 2017 SHENZHEN CHIPSEA TECHNOLOGIES CO.,LTD.
 *                ALL RIGHTS RESERVED
 *
 * This entire notice must be reproduced on all copies of this file
 * and copies of this file may only be made by a person if such person is
 * permitted to do so under the terms of a subsisting license agreement
 * from CHIPSEA.
 *
 *      Release Information : CSA37FX61 
 *-----------------------------------------------------------------------------
 */

#include "compile_option.h"

#ifdef CS_F61

#ifndef __CSA37FX61_GPIO_H
#define __CSA37FX61_GPIO_H

#include "csa37fx61.h"
#include "absacc.h"
#include "csa37fx61_lib.h"

#define GPIO_PA0  0x0001
#define GPIO_PA1  0x0002
#define GPIO_PA2  0x0004
#define GPIO_PA3  0x0008
#define GPIO_PA4  0x0010
#define GPIO_PA5  0x0020
#define GPIO_PA6  0x0040
#define GPIO_PA7  0x0080
#define GPIO_PA8  0x0100
#define GPIO_PA9  0x0200
#define GPIO_PA10 0x0400
#define GPIO_PA11 0x0800
#define GPIO_PA12 0x1000 
#define GPIO_PA13 0x2000
#define GPIO_PA14 0x4000 
#define GPIO_PA15 0x8000 

typedef enum
{ 
    GPIO_Mode_OUTPUT = 0x01,
    GPIO_Mode_INPUT = 0x00,
}GPIOMode_TypeDef;

typedef enum
{ 
    GPIO_INTMode_RISING = 0x00,
    GPIO_INTMode_FALLING = 0x01,
    GPIO_INTMode_HIGH = 0x02,
    GPIO_INTMode_LOW = 0x03,
}GPIO_INTMODE_TypeDef;

typedef enum
{ 
    GPIO_LIRC = 0x00,
    GPIO_HCLK = 0x01,
}GPIO_CLKSOURCE_TypeDef;

typedef enum
{ 
    GPIO_Period_1 = 0x00,
    GPIO_Period_2 = 0x01,
    GPIO_Period_4 = 0x02,
    GPIO_Period_8 = 0x03,
    GPIO_Period_16 = 0x04,
    GPIO_Period_32 = 0x05,
    GPIO_Period_64 = 0x06,
    GPIO_Period_128 = 0x07,
    GPIO_Period_256 = 0X08,
    GPIO_Period_512 = 0x09,
    GPIO_Period_1024 = 0x0A,
    GPIO_Period_2048 = 0x0B,
    GPIO_Period_4096 = 0x0C,
    GPIO_Period_8192 = 0x0D,
    GPIO_Period_16384 = 0x0E,
    GPIO_Period_32768 = 0x0F,
}GPIO_PERIOD_TypeDef;

void GPIO_SetMode(uint16_t GPIO_Pin , GPIOMode_TypeDef GPIO_Mode);
void GPIO_WriteBits(uint16_t GPIO_Pin , uint8_t is_high);
uint8_t GPIO_ReadInputDataBit(uint16_t GPIO_Pin);
uint8_t GPIO_ReadOutputDataBit(uint16_t GPIO_Pin);
void GPIO_CloseInputChannel(uint16_t GPIO_Pin);
void GPIO_OpenInputChannel(uint16_t GPIO_Pin);
void GPIO_DisWriteOutput(uint16_t GPIO_Pin);
void GPIO_EnWriteOutput(uint16_t GPIO_Pin);
void GPIO_EnPullUp(uint16_t GPIO_Pin);
void GPIO_DisPullUp(uint16_t GPIO_Pin);
void GPIO_EnTYP(uint16_t GPIO_Pin);
void GPIO_DisTYP(uint16_t GPIO_Pin);
void GPIO_EnINTFilter(uint16_t GPIO_Pin);
void GPIO_DisINTFilter(uint16_t GPIO_Pin);
void GPIO_INTFilter_Setting(GPIO_CLKSOURCE_TypeDef CLK_Source, GPIO_PERIOD_TypeDef period );
void GPIO_EnINTMode(uint16_t GPIO_Pin, GPIO_INTMODE_TypeDef INT_Mode);
void GPIO_DisINTMode(uint16_t GPIO_Pin);
unsigned char GPIO_INTStatus(uint16_t GPIO_Pin);

uint8_t GPIO_ReadInOutState(uint16_t GPIO_Pin);

uint8_t GPIO_ReadInputChState(uint16_t GPIO_Pin);

uint8_t GPIO_ReadPullUpState(uint16_t GPIO_Pin);


#endif /* __CSA37FX61_GPIO_H */

#endif /* End of CS_F61 */
